package pruebas;


import modelo.auto.*;
import modelo.escenario.*;
import modelo.excepciones.*;
import modelo.juego.*;

import java.util.*;

import junit.framework.*;

public class TestTaller extends TestCase {
	private Taller taller;
	private Usuario usr;
	final static double dineroInicial= 10000;
	protected void setUp() throws Exception {
		
		Auto auto = new Auto();
		usr= new Usuario("pepe", 0, 0, auto);
		
		usr.setDinero(dineroInicial);
		
		/////
		LinkedList<ElementoTaller> elementos = new LinkedList<ElementoTaller>();
		elementos.add(new Motor());
		////
		
		taller = new Taller(elementos);
		
				
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public void testComprarComponente() {
		double costo = 10;
		double peso = 120;
		
		Componente nuevoComponente = new Componente("motor", "Motor", costo, peso, 1.2, 2.3, 80.0);
		Motor nuevoMotor = new Motor();
		nuevoMotor.setMaxRPM(Double.MAX_VALUE);
		nuevoMotor.setRPMOffset(Double.MAX_VALUE);
		
		try {
			taller.comprarComponente(usr, nuevoComponente);
			
		}
		catch (UnableToBuyComponentException noSePudoComprar){
			fail ("no tenia dinero suficiente");
			
		}
		catch (UnableToAddElementToListException e2){
			fail("no se pudo agregar a la lista");
		}
		catch(InvalidMaxMarchaCajaException e3){
			fail("error de caja");
		} catch (ComponentAlreadyExistsException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//intento agregar el mismo componente de nuevo
		try {
			taller.comprarComponente(usr, nuevoComponente);
			fail("Agregó un componente que ya existe"); //falla

			
		}
		catch (UnableToBuyComponentException noSePudoComprar){
			
			//successful test
		}
		catch (UnableToAddElementToListException e2){
			//successful test
		}
		catch(InvalidMaxMarchaCajaException e3){
			//successful test
		} catch (ComponentAlreadyExistsException e) {
			// TODO Auto-generated catch block
			fail("componente ya existe");
		}
		
		try{
			taller.comprarComponente(usr, nuevoMotor);
		}
		catch (UnableToBuyComponentException noSePudoComprar){
			fail ("no tenia dinero suficiente" + Double.toString(nuevoMotor.getPrecio()));
			
		}
		catch (UnableToAddElementToListException e2){
			fail("no se pudo agregar a la lista");
		}
		catch(InvalidMaxMarchaCajaException e3){
			fail("error de caja");
		} catch (ComponentAlreadyExistsException e) {
			// TODO Auto-generated catch block
			fail("componente ya existe");
		}
		
		
	}
	


	public void testRemoverComponente() {
		
		Componente componenteNuevo= new Componente();
		try {
			taller.removerComponente(usr, componenteNuevo);
			fail("No se genera la excepcion correspondiente al intentar remover componente que no existe");
		} catch (UnableToRemoveElementFromListException e) {
			// successful test

		}
		
	}

	
	public void testAjustarComponente() {
		Componente componente = new KitNeumatico();
		try {
			taller.agregarStockComponente(componente);
			
		
		} catch (UnableToAddElementToListException e1) {
			
		}
		double montoAbonadoPorUsuario=  (2 * dineroInicial);
		try {
			taller.ajustarComponente(usr, componente, montoAbonadoPorUsuario);
			fail("no se genero la excepcion");

		} catch (UnableToAdjustComponentException e) {
		
		} catch (InvalidMontoAbonadoException e) {
			//fail("Monto Abonado mayor al dinero disponible");
			// successful test
		}
		
		double montoNegativo = (-2 * dineroInicial);
		
		try {
			taller.ajustarComponente(usr, componente, montoNegativo);
			fail("El monto abonado es negativo");
		} catch (UnableToAdjustComponentException e) {
			
		} catch (InvalidMontoAbonadoException e) {
		
		}
		
		
	}

	public void testAgregarStockComponente() {
		double costo = 10000;
		double peso= 30;
		double factVel= 1;
		double factAce= 3;
		double vidaUtil= 140;
		Componente componenteUno = new Componente("neumatico", "neumatico", costo, peso, factVel, factAce, vidaUtil);
		try {
			taller.agregarStockComponente(componenteUno);
		} catch (UnableToAddElementToListException e) {
			//
		}
		assertTrue(taller.existeComponenteEnStock(componenteUno));
		
	}

	public void testGetListaComponentes() {
		LinkedList<ElementoTaller> listaComponentes = taller.getListaComponentes();
		assertEquals(listaComponentes, taller.getListaComponentes());
	}

	public void testGetListaComponentesAuto() {
		LinkedList<ElementoTaller> listaComponentesAuto = usr.getAuto().getComponentesAuto();
		assertEquals(listaComponentesAuto, taller.getListaComponentesAuto(usr));
		
	}

}
